package miniBanco.Mapper;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import basics.DBManager;
import miniBanco.Core.Cuenta;
import miniBanco.Core.DomainObject;
import miniBanco.Core.Movimiento;
import miniBanco.Core.TipoConcepto;
import miniBanco.Mapper.Interface.IMovimientoFinder;

public class MovimientoMapper extends AbstractMapper implements IMovimientoFinder{
	private static final String TAG = CuentaMapper.class.getSimpleName();
	public static final String IDCOLUMN = "id";
	public static final String COLUMNS = "idCuenta,TipoConcepto,Importe,Descripcion";
	@Override
	protected StringBuilder findStatement() {
		StringBuilder sb = new StringBuilder();
		sb.append("SELECT "+IDCOLUMN+","+COLUMNS+
				" FROM "+ getTableName()+
				" WHERE id = %d ");
		return sb;
	}
	
	public void findAllFor(Cuenta cuenta) throws SQLException {
		String sql = String.format(findForCuenta().toString(), cuenta.getID());
		ResultSet rs = sqlHelper.ExecuteQuery(sql, TAG);

		List<Movimiento> movList = new ArrayList<Movimiento>();
		while(rs.next())
		{
			Movimiento mov = (Movimiento) load(rs);
			movList.add(mov);
			DBManager.Log(TAG,"Load Movimiento||ID:"+mov.getID()+"||CuentaID:"+cuenta.getID());
		}
		
		cuenta.setMovimientos(movList);
	}
	
	protected DomainObject doLoad(long id, ResultSet rs) throws SQLException {
		id = rs.getLong(1);
		int TipoConcepto = rs.getInt(3);
		float Importe = rs.getFloat(4);
		String Descripcion = rs.getString(5);
		TipoConcepto tipoConcepto = mapperRegistry.TipoConceptoDao().getByTipo(TipoConcepto);
		Movimiento movimiento = new Movimiento(tipoConcepto,Importe);
		movimiento.setDescripcion(Descripcion);
		movimiento.setID(id);
		return movimiento;
	}
	
	private String findForCuenta()
	{
		return 	"SELECT "+IDCOLUMN+","+COLUMNS+
				" FROM "+ getTableName()+
				" WHERE idCuenta = %d ";
	}

	@Override
	protected StringBuilder doInsert(DomainObject subject) {
		Movimiento movimiento = (Movimiento) subject;
		String insertStatment = "INSERT INTO "+getTableName()+" ("+COLUMNS+")  VALUES (%d,%d,%.2f,'%s') ";
		insertStatment = String.format(Locale.US,insertStatment, movimiento.getCuenta().getID(),
				movimiento.getConcepto().getValue(),
				movimiento.getImporte(),
				movimiento.getDescripcion());
			
		StringBuilder sb = new StringBuilder();
		sb.append(insertStatment);
		return sb;
	}
	@Override
	protected String getTableName() {
		return "Movimientos";
	}
	@Override
	public Movimiento find(long id) {
		return (Movimiento) abstractFind(id);
	}

	@Override
	public void doSave(DomainObject subject) {
		Movimiento movimiento = (Movimiento) subject;
		save(movimiento);
	}
	public void doDelete(DomainObject subject) {
		Movimiento movimiento = (Movimiento) subject;
		delete(movimiento);
	}

	@Override
	protected StringBuilder doUpdate(DomainObject subject) {
		// TODO Auto-generated method stub
		return null;
	}	
}
